package com.tetris

import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.geometry.Size
import androidx.compose.ui.graphics.drawscope.DrawScope

// ██
// ██
class Block1: Block {
    /**
     * 构造方法。
     */
    constructor() {
        mBlocks[2][2].mUsed = true
        mBlocks[2][1].mUsed = true
        mBlocks[1][2].mUsed = true
        mBlocks[1][1].mUsed = true
    }

    /**
     * 进入预览区域。
     * @param previewWidth  预览区域宽度
     * @param previewHeight 预览区域高度
     * @param drawer        绘图者
     */
    override fun enterPreview(previewWidth: Float, previewHeight: Float, drawer: DrawScope) {
        val x = previewWidth / 2f - Const.GRID_SIZE
        val y = previewHeight / 2f - Const.GRID_SIZE

        for (i in 0..1) {
            for (j in 0..1) {
                drawer.drawRect(mColor, Offset(x + Const.GRID_SIZE * j, y + Const.GRID_SIZE * i), Size(Const.GRID_SIZE, Const.GRID_SIZE))
                drawEdge(drawer, x + Const.GRID_SIZE * j, y + Const.GRID_SIZE * i)
            }
        }
    }

    /**
     * 获取底端所在的行数。底端是指方块最下方的有效格。
     */
    override val bottom: Int
        get() = mRow.intValue + 2

    /**
     * 对不能下落的处理。
     */
    override fun handleCannotMoveDown() {
        Game.sExistentBlocks[mRow.intValue + 2][mLine.intValue + 2].mUsed = true
        Game.sExistentBlocks[mRow.intValue + 2][mLine.intValue + 1].mUsed = true
        Game.sExistentBlocks[mRow.intValue + 1][mLine.intValue + 2].mUsed = true
        Game.sExistentBlocks[mRow.intValue + 1][mLine.intValue + 1].mUsed = true
        Game.sExistentBlocks[mRow.intValue + 2][mLine.intValue + 2].mColor = mColor
        Game.sExistentBlocks[mRow.intValue + 2][mLine.intValue + 1].mColor = mColor
        Game.sExistentBlocks[mRow.intValue + 1][mLine.intValue + 2].mColor = mColor
        Game.sExistentBlocks[mRow.intValue + 1][mLine.intValue + 1].mColor = mColor
    }

    /**
     * 下落。
     * @return 成功则返回 true，否则返回 false。
     */
    override fun moveDown(): Boolean {
        if (mRow.intValue == 17) {
            this.handleCannotMoveDown()
            return false
        }
        if (Game.sExistentBlocks[mRow.intValue + 3][mLine.intValue + 1].mUsed ||
            Game.sExistentBlocks[mRow.intValue + 3][mLine.intValue + 2].mUsed) {
            this.handleCannotMoveDown()
            return false
        }

        return super.moveDown()
    }

    /**
     * 左移。
     */
    override fun moveLeft() {
        if (mLine.intValue == -1) {
            return
        }
        if (Game.sExistentBlocks[mRow.intValue + 1][mLine.intValue].mUsed ||
            Game.sExistentBlocks[mRow.intValue + 2][mLine.intValue].mUsed) {
            return
        }

        super.moveLeft()
    }

    /**
     * 右移。
     */
    override fun moveRight() {
        if (mLine.intValue == 7) {
            return
        }
        if (Game.sExistentBlocks[mRow.intValue + 1][mLine.intValue + 3].mUsed ||
            Game.sExistentBlocks[mRow.intValue + 2][mLine.intValue + 3].mUsed) {
            return
        }

        super.moveRight()
    }

    /**
     * 获取顶端所在的行数。顶端是指方块最上方的有效格。
     */
    override val top: Int
        get() = mRow.intValue + 1

    /**
     * 变形。
     */
    override fun transform() {
    }
}
